package de.draufi;

import de.draufi.tracking.Wegpunkt;

public class Analyse {

	Wegpunkt[] wegpunkte = null;
	
	public Analyse(Wegpunkt[] wp){
		wegpunkte = wp;
	}
	
	/**
	 * Ermittelt die Summe der Einzeldistanzen von Wegpunkte[p1] bis Wegpunkte[p2] 
	 * @param p1 Index des ersten Wegpunktes
	 * @param p2 Index des zweiten Wegpunktes
	 * @return Distanz in km
	 */
	public double getDistance(int p1, int p2) {
		double d = 0;
		if (p1 < p2) {
			for (int i=p1; i<p2; i++) { 
				d = d + wegpunkte[i].getDistance(wegpunkte[i+1]);
			}
		} else if (p1 > p2) {
			for (int i=p2; i<p1; i++) { 
				d = d + wegpunkte[i].getDistance(wegpunkte[i+1]);
			}
		} 
		return d;
	}
	
	/**
	 * Ermittelt die Summe der Einzeldauern von Wegpunkte[p1] bis Wegpunkte[p2] 
	 * @param p1 Index des ersten Wegpunktes
	 * @param p2 Index des zweiten Wegpunktes
	 * @return Dauer in Millisekunden
	 */
	public long getDuration(int p1, int p2) {
		long d = 0;
		if (p1 < p2) {
			d = wegpunkte[p1].getDuration(wegpunkte[p2]);
		} else if (p1 > p2) { 
			d = wegpunkte[p1].getDuration(wegpunkte[p2]);
		} 
		return d;
	}
	
	public double getSpeed(int p1, int p2) {
		long d = getDuration(p1, p2);
		double result = 0;
		if (d != 0) {
			result = getDistance(p1, p2) / d;
		} else {
			result = 0;
		}
		return result;
	}
	
	/**
	 * Liefert den Index des Wegpunktes, der den geforderten zeitlichen Abstand zum Beginn hat
	 * @param p1 Index des Startpunktes
	 * @param Abstand Abstand in Millisekunden
	 * @return Index des gefundenen Wegpunktes, oder letzter Punkt der Sammlung
	 */
	public int getWPidx_Time(int p1, long Abstand) {
		int result = 0;
		
		for (int i=p1+1; i<wegpunkte.length; i++) {
			if (getDuration(p1, i) >= Abstand) {
				result = i;
				i = wegpunkte.length; //Schleifenabbruch
			}
		}
		if (result == 0) {
			result = wegpunkte.length;
		}
		
		return result;
	}
}
